Introduction

A systematic review of positive interactions and the niche in deserts.
The niche is a powerful concept in ecology and at times not entirely coupled to local interactions between species. Herein, we review the capacity for these positive plant interactions to expand the niche of subdominant species. We synthesized the available literature using a formalized systematic review by using the Web of Science and associated terms with niche, positive interactions in plants such as facilitation, and deserts.



Literature search & sort

library(tidyverse)
library(DT)

#Search terms####
search.terms <- read_csv("data/search.terms.csv")
datatable(search.terms)
total.lit <- search.terms %>% filter(search != "final")
total.lit
## # A tibble: 6 x 4
##   search                             terms  hits hits.2017
##    <chr>                             <chr> <int>     <int>
## 1      1     plant facilitat* niche* arid*    47        50
## 2      2   plant facilitat* niche* desert*    32        31
## 3      3          nurse plant* niche* arid    16        19
## 4      4        nurse plant* niche* desert    11        11
## 5      5 positive interact* niche* desert*    21        21
## 6      6   positive interact* niche* arid*    29        35
totals <- sum(total.lit$hits)
totals
## [1] 156
final.list <- 53
totals-final.list
## [1] 103
#PRISMA####
#use 'prisma' function from PRISMAstatement 
#https://cran.r-project.org/web/packages/PRISMAstatement/vignettes/PRISMA.html
prisma.report <-read_csv("data/prisma.csv")
prisma.report
## # A tibble: 53 x 4
##       ID inclusion                          category
##    <int>     <chr>                             <chr>
##  1     1         N no positive interactions recorded
##  2     2         Y                           include
##  3     3         Y                           include
##  4     4         N       no niche expansion recorded
##  5     5         Y                           include
##  6     6         N no positive interactions recorded
##  7     7         N no positive interactions recorded
##  8     8         N no positive interactions recorded
##  9     9         Y                           include
## 10    10         Y                           include
## # ... with 43 more rows, and 1 more variables: detailed.reason <chr>
exclusions <- prisma.report %>% filter(inclusion == "N") %>% select(ID, category)
dim(exclusions)
## [1] 24  2
library(PRISMAstatement)
#first search (2015)
prisma(found = 156,
       found_other = 0,
       no_dupes = 53, 
       screened = 53, 
       screen_exclusions = 0, 
       full_text = 53,
       full_text_exclusions = 24, 
       qualitative = 0, 
       quantitative = 29,
       width = 800, height = 800)
#second search (2017)
prisma(found = 196,
       found_other = 0,
       no_dupes = 70, 
       screened = 70, 
       screen_exclusions = 0, 
       full_text = 70,
       full_text_exclusions = 34, 
       qualitative = 0, 
       quantitative = 36,
       width = 800, height = 800)
#Summary of exclusions
categories <- exclusions %>% group_by(category) %>% tally() %>% arrange(desc(n))
categories
## # A tibble: 6 x 2
##                            category     n
##                               <chr> <int>
## 1                    no nurse plant     9
## 2 no positive interactions recorded     9
## 3       no niche expansion recorded     2
## 4                            review     2
## 5                          language     1
## 6                        not desert     1
ggplot(categories, aes(category, n)) + geom_bar(stat = "identity") + coord_flip() + ylim(0,10)

Search contrasts using DOI-matcher

search.1.1 <- read_csv("data/2016-search-total.csv")
search.1.2 <- read_csv("data/2017-search.csv")
net.difference <- anti_join(search.1.2, search.1.1, by = "DOI")
#net.difference <- net.difference %>% select(Title, DOI) #to simplify for a look
nrow(net.difference) #count of number of differences from consecutive search
## [1] 30
#write_csv(net.difference, "data/net.difference.csv")

#double-check
net.difference <- anti_join(search.1.2, search.1.1, by = "Title")
nrow(net.difference)
## [1] 59

Systematic review

data <- read_csv("data/data.csv")
data
## # A tibble: 36 x 17
##       ID                                                         topic
##    <int>                                                         <chr>
##  1     2                                        Niche characterization
##  2     3                                        Niche characterization
##  3     5                             Niche partioning and interactions
##  4     9   Niche changes over ontogeny and inter-specific facilitation
##  5    10        Environmental niche: shade and rainfall of four shrubs
##  6    11                            Coexistence in grass-shrub steppes
##  7    15              Niche differentiation/segregation in a shrubland
##  8    16                   Niche partioning in tree-grass interactions
##  9    20    Niche partioning among shrub-annuals and biological crusts
## 10    21 Regeneration niche of six shrubs using one-week-old seedlings
## # ... with 26 more rows, and 15 more variables: expansion.mechanism <chr>,
## #   niche.concept <chr>, application <chr>, niche.measurement <chr>,
## #   benefactor <chr>, benefactor.life.form <chr>, benefactor.family <chr>,
## #   beneficiary <chr>, beneficiary.life.form <chr>,
## #   beneficiary.family <chr>, ecosystem <chr>, lat <dbl>, long <dbl>,
## #   country <chr>, elevation.m <int>
#map####
#ggplot2 vers
require(maps)
world<-map_data("world")
map<-ggplot() + geom_polygon(data=world, fill="gray50", aes(x=long, y=lat, group=group))
map + geom_point(data=data, aes(x=long, y=lat)) + labs(x = "longitude", y = "latitude")

#data viz
data.simple <- data %>% group_by(niche.concept, ecosystem) %>% count()

ggplot(na.omit(data.simple), aes(niche.concept, n)) + geom_bar(stat = "identity") + coord_flip() + scale_fill_brewer(palette = "Blues") + labs(x = "niche concept", y =" frequency")

ggplot(na.omit(data.simple), aes(niche.concept, n, fill = ecosystem)) + geom_bar(stat = "identity") + coord_flip() + scale_fill_brewer(palette = "Blues") + labs(x = "niche concept", y =" frequency")

#too many levels

library(stringr)
data <- data %>% 
    rowwise() %>% 
    mutate(matches = str_replace(ecosystem,"^semi-arid.+", "semi-arid"))

data <- data %>% 
    rowwise() %>% 
    mutate(ecosystem = str_replace(ecosystem,"^semi-arid.+", "semi-arid")) %>% 
    mutate(ecosystem = str_replace(ecosystem,"^arid.+", "arid")) %>%
    mutate(ecosystem = str_replace(ecosystem,"^open.+", "other")) %>%
    mutate(ecosystem = str_replace(ecosystem,"^woodland.+", "other")) %>%
    mutate(ecosystem = str_replace(ecosystem,"^sub.+", "other"))
#can also do ifelse() or use replace from dyplr

data.simple <- data %>% group_by(niche.concept, ecosystem) %>% count()

ggplot(na.omit(data.simple), aes(niche.concept, n, fill = ecosystem)) + geom_bar(stat = "identity") + coord_flip() + scale_fill_brewer(palette = "Blues") + labs(x = "niche concept", y =" frequency")

#now, do we need stats? if more >= 5
36/5 #yes
## [1] 7.2
c1<-chisq.test(data.simple$niche.concept, data.simple$n, simulate.p.value = TRUE, B = 10000)
c1 #n.s.
## 
##  Pearson's Chi-squared test with simulated p-value (based on 10000
##  replicates)
## 
## data:  data.simple$niche.concept and data.simple$n
## X-squared = 20.75, df = NA, p-value = 0.5924
c1<-chisq.test(data.simple$ecosystem, data.simple$n, simulate.p.value = TRUE, B = 10000)
c1 #n.s.
## 
##  Pearson's Chi-squared test with simulated p-value (based on 10000
##  replicates)
## 
## data:  data.simple$ecosystem and data.simple$n
## X-squared = 7.0583, df = NA, p-value = 0.9686
#count up levels for summary in results
n_distinct(data$country)
## [1] 11
n_distinct(data$niche.concept)
## [1] 5
n_distinct(data$ecosystem)
## [1] 4

Meta-analysis

#data from within each study
data <- read_csv("data/evidence.csv")
data <- data[!is.na(data$p), ]

#libary to use p-values for meta-analytic stats
library(metap)
schweder(data$p) # to explore validity of p-values to capture sense of whether it is a set of relatively small or large p-values as different combining probability tests have different assumptions.

sumz(p, data = data) #sumz assumes equal emphasis of large and small p-values
## sumz =  6.912241 p =  2.385276e-12
sumz(p, weights = n.reps, data = data) #weight by sample sizes
## sumz =  5.760639 p =  4.189799e-09
#then repeat for each hypothesis/niche.concept separately once all p-values collected

sumlog(data$p) #emphasis on small p-values and also known as Fisher’s method (most common combining probabitlities method) good general check
## chisq =  74.5954  with df =  12  p =  4.381382e-11


Interpretation

  1. Map of world and total of 11 different countries show that concept of niche not extensively tested in field globally.
  2. A total of 5 distinct niche concepts tested across 12 different ecosystems. This suggests an excellent start to field research on topic at this level with deserts.
  3. No significant differences between frequencies examined between ecosystem classes or different major niche concepts at this in point (limited number of independent tests).
  4. There was extensive variation in how the niche was tested within deserts within the context of positive interactions. The statistical tests were simple and relatively under-reported. The variation in measures precluded an effect size meta-analysis. Consequently, a combining p-value meta-analysis was done.